home *** CD-ROM | disk | FTP | other *** search
/ Joystick Magazine 1996 May / cd joy 71No13.iso / pc / demos / eurosoc / source / mallocx.c < prev    next >
Text File  |  1996-03-05  |  2KB  |  98 lines

  1. // Substitute malloc functions...
  2.  
  3. #include <i86.h>
  4. #include <dos.h>
  5. #include <stdio.h>
  6. #include <malloc.h>
  7. #include <string.h>
  8.  
  9. extern int w95;
  10.  
  11. struct meminfo {
  12.     unsigned LargestBlockAvail;
  13.     unsigned MaxUnlockedPage;
  14.     unsigned LargestLockablePage;
  15.     unsigned LinAddrSpace;
  16.     unsigned NumFreePagesAvail;
  17.     unsigned NumPhysicalPagesFree;
  18.     unsigned TotalPhysicalPages;
  19.     unsigned FreeLinAddrSpace;
  20.     unsigned SizeOfPageFile;
  21.     unsigned Reserved[3];
  22.     } MemInfo;
  23.          
  24. unsigned int get_mem_info()
  25. {
  26.     union REGS regs;
  27.     struct SREGS sregs;
  28.  
  29.     regs.x.eax=0x500;
  30.     memset(&sregs,0,sizeof(sregs));
  31.     sregs.es=FP_SEG(&MemInfo);
  32.     regs.x.edi=FP_OFF(&MemInfo);
  33.     int386x(0x31,®s,®s,&sregs);
  34.  
  35.     return (MemInfo.LargestBlockAvail);
  36. }
  37.  
  38. void *mallocx(unsigned int size)
  39. {
  40.     union REGS regs;
  41.     unsigned int *address;
  42.     unsigned int handle;
  43.  
  44.     if (0)//w95)
  45.         return(malloc(size));
  46.  
  47.     if (size==0) return (NULL);
  48.  
  49.     size+=4; // Reserve 4 bytes for handle
  50.  
  51.     regs.x.eax=0x501;
  52.     regs.w.bx=size/65536;
  53.     regs.w.cx=size%65536;
  54.  
  55.     int386(0x31,®s,®s);
  56.  
  57.     if (regs.w.cflag&1)
  58.         return (NULL);
  59.  
  60.     address=(unsigned int *)(regs.w.cx+regs.w.bx*65536);
  61.     handle=(unsigned int)(regs.w.di+regs.w.si*65536);
  62.     *address++=handle;
  63.  
  64. //    printf("Reserve handle = %d\n",handle);
  65.  
  66.     return ((void *)address);
  67. }
  68.  
  69. void freex(void *address)
  70. {
  71.     union REGS regs;
  72.     unsigned int handle;
  73.  
  74.     if (0)//w95) 
  75.     {
  76.         free(address);
  77.         return;
  78.     }                
  79.  
  80.     if (address!=NULL)
  81.     {
  82.         handle=*((unsigned int *)address-1);
  83.  
  84. //        printf("Free handle = %d\n",handle);
  85.  
  86.         regs.x.eax=0x502;
  87.         regs.w.si=handle/65536;
  88.         regs.w.di=handle%65536;
  89.  
  90.         int386(0x31,®s,®s);
  91.  
  92. //        if (regs.w.cflag&1)
  93. //            puts("Error freeing linear memory");
  94.     }
  95. }
  96.  
  97. 
  98.